package handler

import (
	"github.com/gin-gonic/gin"
	"news/pkg/apps"
	"news/pkg/apps/ctx"
	"news/pkg/models"
	"news/pkg/types"
)

// SearchNews 查询新闻
// @Tags News
// @Summary 查询新闻列表
// @Accept json
// @Produce json
// @Security AuthToken
// @Param json query types.SearchNewsForm true "parameter"
// @router /news [GET]
// @Success 200 {object} types.APIResponse{result=types.APIPageResult}
func SearchNews(c *gin.Context) {
	ac := ctx.New(c)
	form := types.SearchNewsForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}

	ac.Response(apps.SearchNews(ac, &form))
}

// GetNewsById 通过ID查询新闻
// @Tags News
// @Summary 通过ID查询新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "news id"
// @router /news/{id} [GET]
// @Success 200 {object} types.APIResponse{result=models.News}
func GetNewsById(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.GetNewsById(ac, models.Id(c.Param("id"))))
}

// CreateNews 创建新闻
// @Tags News
// @Summary 创建新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param json body types.CreateNewsForm true "parameter"
// @router /news [POST]
// @Success 200 {object} types.APIResponse{result=models.News}
func CreateNews(c *gin.Context) {
	ac := ctx.New(c)
	form := types.CreateNewsForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}

	ac.Response(apps.CreateNews(ac, &form))

}

// DeleteNewsById 删除新闻
// @Tags News
// @Summary 删除新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "news id"
// @router /news/{id} [DELETE]
// @Success 200 {object} types.APIResponse
func DeleteNewsById(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.DeleteNewsById(ac, models.Id(c.Param("id"))))
}

// DeleteNewsByIds 通过id组删除新闻
// @Tags News
// @Summary 通过id组删除新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param json body types.DeleteNewsForm true "parameter"
// @router /news [DELETE]
// @Success 200 {object} types.APIResponse
func DeleteNewsByIds(c *gin.Context) {
	ac := ctx.New(c)
	form := types.DeleteNewsForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.DeleteNews(ac, &form))
}

// UpdateNewsById 通过id修改新闻
// @Tags News
// @Summary 通过id修改新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "news id"
// @Param json body types.UpdateNewsForm true "parameter"
// @router /news/{id} [PUT]
// @Success 200 {object} types.APIResponse
func UpdateNewsById(c *gin.Context) {
	ac := ctx.New(c)
	form := types.UpdateNewsForm{}
	form.Id = models.Id(c.Param("id"))
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.UpdateNewsById(ac, &form))
}

// UpdateNewsStateByIds 通过id组修改新闻状态
// @Tags News
// @Summary 通过id组修改新闻状态
// @Accept json
// @Produce json
// @Security AuthToken
// @Param json body types.UpdateStateForm true "parameter"
// @router /news [PUT]
// @Success 200 {object} types.APIResponse
func UpdateNewsStateByIds(c *gin.Context) {
	ac := ctx.New(c)
	form := types.UpdateStateForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.UpdateStateByIds(ac, &form))
}

// GetNewsByUserId 通过用户id查询新闻
// @Tags News
// @Summary 通过用户id查询新闻
// @Accept json
// @Produce json
// @Security AuthToken
// @Param id path string true "user id"
// @Param json query types.GetNewsByUserIdForm true "parameter"
// @router /news/getByUser/{id} [GET]
// @Success 200 {object} types.APIResponse{result=[]types.GetNewsResp}
func GetNewsByUserId(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetNewsByUserIdForm{}
	form.UserId = models.Id(c.Param("id"))
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetNewsByUserId(ac, &form))
}

// GetNewsCountByType 获取新闻数量
// @Tags News
// @Summary 获取新闻数量
// @Accept json
// @Produce json
// @Security AuthToken
// @Param form query types.GetNewsCountByTypeForm true "parameter"
// @router /news/getCountByType [GET]
// @Success 200 {object} types.APIResponse{result=[]types.GetCountResp}
func GetNewsCountByType(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetNewsCountByTypeForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetNewsCountByType(ac, &form))
}

// GetNewsByState 获取待审批新闻
// @Tags News
// @Summary 获取待审批新闻s
// @Accept json
// @Produce json
// @Security AuthToken
// @Param form query types.GetNewsByState true "parameter"
// @router /news/getNewsByState [GET]
// @Success 200 {object} types.APIResponse{result=[]types.GetNewsResp}
func GetNewsByState(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetNewsByState{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetNewsByState(ac, &form))
}

// GetNewsList 默认获取10条最新新闻
// @Tags News
// @Summary 默认获取10条最新新闻
// @Accept json
// @Produce json
// @Param form query types.GetNewsListForm true "parameter"
// @Security AuthToken
// @router /news/list [GET]
// @Success 200 {object} types.APIResponse{result=[]types.GetNewsResp}
func GetNewsList(c *gin.Context) {
	ac := ctx.New(c)
	form := types.GetNewsListForm{}
	if err := ac.Bind(&form); err != nil {
		return
	}
	ac.Response(apps.GetNewsList(ac, &form))
}

// GetWeekNewsAddCount 获取7天内新增新闻数量
// @Tags News
// @Summary 获取7天内新增新闻数量
// @Accept json
// @Produce json
// @Security AuthToken
// @router /news/weekCount [GET]
// @Success 200 {object} types.APIResponse{result=types.WeekNewsCountResp}
func GetWeekNewsAddCount(c *gin.Context) {
	ac := ctx.New(c)
	ac.Response(apps.GetWeekCount(ac))
}
